/*
 * @Author: WuFeng <763467339@qq.com>
 * @Date: 2022-10-10 11:00:40
 * @LastEditTime: 2025-09-28 15:52:41
 * @LastEditors: WuFeng <763467339@qq.com>
 * @Description: 工具集
 * @FilePath: \vue-code-design\utils\index.js
 * @Copyright 版权声明
 */

const fs = require('fs')
const path = require('path') // 添加这一行

/**
 * @description 获取目录下的文件数组
 * @param {object} cfg 配置对象，搜索路径，提取文件，忽略文件，是否递归
 * @returns {array} 文件数组
 * 
// // 配置
// let config = {
//     path: __dirname,  // 搜索路径 或者""F:\\Html" 注意要打'\\'，不能'\'要转义或者直接写'/'
//     extract: ["html"], // 提取文件的名称，支持后缀查询，如果为空，则提取全部
//     ignoreFile: [], // 忽略文件的名称，支持后缀查询 优先级大于extract
//     isRecursion: true // 是否递归取文件目录下面的所有文件夹
// }
// console.log(filesFind(config ))
 */
function filesFind(cfg){
    let arrFiles = []
    ;(function find(fPath, extract, ignoreFile, isRecursion){
        let arr = fs.readdirSync(fPath) // 可以获取改目录下面的子文件和文件夹名称
        arr.forEach((value, index, arr)=>{
            if(fs.statSync(`${fPath}/${value}`).isDirectory()){ // 判断是否为文件夹
                if(isRecursion) find(`${fPath}/${value}`, extract, ignoreFile, isRecursion)
                else arrFiles.push(`${fPath}/${value}`)
            }
            else {
                if(extract.slice(-1)[0]){ // 是否为空，如果为空，则提取全部
                    if(!extract.some((val) => value.endsWith(val))) {
                        return
                    }
                }
                if(! ignoreFile.some((val)=> value.endsWith(val))){ // 忽略ignoreFile里面的文件
                    arrFiles.push(`${fPath}/${value}`)
                }
            } 
        })
    })(cfg.path, cfg.extract, cfg.ignoreFile, cfg.isRecursion)
    return arrFiles
}

/**
 * @description 获取文件名带后缀名
 * @param {*} path
 * @return {*} 
 */
function getFileName(path) {
  var pos1 = path.lastIndexOf('/')
  var pos2 = path.lastIndexOf('\\')
  var pos  = Math.max(pos1, pos2)
  if( pos<0 ) {
    return path
  } else {
    return path.substring(pos+1)
  }
}

/**
 * @description 获取文件名不带后缀名
 * @param {*} path
 * @return {*} 
 */
function getFileName2(path) {
  var pos1 = path.lastIndexOf('/');
  var pos2 = path.lastIndexOf('\\');
  var pos = Math.max(pos1, pos2);
  if (pos < 0) {
    return path;
  }else {
    let tempPath = path.substring(pos + 1);
    return tempPath.substring(0, tempPath.lastIndexOf("."));
  }
}

/**
 * @description 递归删除文件夹及文件夹内所有内容
 * @param {*} dirPath 
 */
function rmdir(dirPath) {
  // 首先判断文件路径是否存在
  if (fs.existsSync(dirPath)) {
    // 获取该文件夹下所有的文件
    let files = fs.readdirSync(dirPath)
    let childPath = null
    files.forEach(child => {
      // 拼接路径
      childPath = `${dirPath}/${child}`
      // 如果该文件是文件夹
      if (fs.statSync(childPath).isDirectory()) {
        // 递归
        rmdir(childPath)
        // 删除文件夹
        fs.rmdirSync(childPath)
      } else {
        // 删除文件
        fs.unlinkSync(childPath)
      }
    })
  } else {
  }
}

// writeFileByUser('./data/17/1017.md');
/**
 * @description 创建文件夹
 */
const dirCache={};
function mkdir(filePath) {
  // 处理路径分隔符，统一转换为Node.js可以理解的格式
  const normalizedPath = path.normalize(filePath);
  // 获取目录路径（去掉文件名）
  const directory = path.dirname(normalizedPath);
  
  // 确保目录存在
  if (!fs.existsSync(directory)) {
    try {
      // 使用recursive: true选项递归创建所有必要的目录
      fs.mkdirSync(directory, { recursive: true });
      // console.log(`成功创建目录: ${directory}`);
    } catch (err) {
      console.error(`创建目录失败: ${err.message}`);
      throw err;
    }
  }
  
  // 确保文件存在（如果不存在则创建空文件）
  if (!fs.existsSync(normalizedPath)) {
    fs.writeFileSync(normalizedPath, '');
  }
}

/**
 * @description 写文件，文件夹不存在则创建
 * @param {*} filePath 
 */
function writeFileByUser(filePath, data){
  if (fs.existsSync(filePath)) {
    // 文件已存在，可以选择覆盖或追加
  } else {
    // 创建目录结构
    mkdir(filePath);
  }

  return fs.appendFileSync(filePath, data, 'utf8')
}

/**
 * @description 响应出参数据组装
 * @param {
 *          type: succ 成功 / fail 失败
 *          message: 错误消息
 *          data: 数据
 *        }
 */
function responseData({
  type = 'succ',
  message = '',
  data = {}
}) {
  return {
    code: (type === 'succ') ? 2000 : 500,
    message,
    data
  }
}

/**
 * 暴露方法
 */
// 响应出参数据组装
exports.responseData = responseData
// 获取目录下的文件数组
exports.filesFind = filesFind
// 获取文件名带后缀名
exports.getFileName = getFileName
// 写文件，文件夹不存在则创建
exports.writeFileByUser = writeFileByUser
// 递归删除文件夹及文件夹内所有内容
exports.rmdir = rmdir
// 创建文件夹
exports.mkdir = mkdir